/**********************************************************************************************************************
 *
 * Project:    mGameEngine
 * File:       nxustreaming.h
 * Author:     twoja stara
 * Created on: 2009-11-02
 *
 **********************************************************************************************************************/

#ifndef NXUSTREAMING_H
#define NXUSTREAMING_H

#include <cstdio>
#include <NxPhysics.h>
#include <NxStream.h>
#include <NxCooking.h>

namespace mGameEngine
{
namespace Physics
{

class NxuMemoryWriteBuffer: public NxStream
{
public:
    NxuMemoryWriteBuffer();
    virtual ~NxuMemoryWriteBuffer();
    void clear();

    virtual NxU8 readByte() const
    {
        NX_ASSERT(0);
        return 0;
    }
    virtual NxU16 readWord() const
    {
        NX_ASSERT(0);
        return 0;
    }
    virtual NxU32 readDword() const
    {
        NX_ASSERT(0);
        return 0;
    }
    virtual float readFloat() const
    {
        NX_ASSERT(0);
        return 0.0f;
    }
    virtual double readDouble() const
    {
        NX_ASSERT(0);
        return 0.0;
    }
    virtual void readBuffer(void *buffer, NxU32 size) const
    {
        NX_ASSERT(0);
    }

    virtual NxStream &storeByte(NxU8 b);
    virtual NxStream &storeWord(NxU16 w);
    virtual NxStream &storeDword(NxU32 d);
    virtual NxStream &storeFloat(NxReal f);
    virtual NxStream &storeDouble(NxF64 f);
    virtual NxStream &storeBuffer(const void *buffer, NxU32 size);

    NxU32 currentSize;
    NxU32 maxSize;
    NxU8 *data;
};

class NxuMemoryReadBuffer: public NxStream
{
public:
    NxuMemoryReadBuffer(const NxU8 *data);
    virtual ~NxuMemoryReadBuffer();

    virtual NxU8 readByte() const;
    virtual NxU16 readWord() const;
    virtual NxU32 readDword() const;
    virtual float readFloat() const;
    virtual double readDouble() const;
    virtual void readBuffer(void *buffer, NxU32 size) const;

    virtual NxStream &storeByte(NxU8 b)
    {
        NX_ASSERT(0);
        return *this;
    }
    virtual NxStream &storeWord(NxU16 w)
    {
        NX_ASSERT(0);
        return *this;
    }
    virtual NxStream &storeDword(NxU32 d)
    {
        NX_ASSERT(0);
        return *this;
    }
    virtual NxStream &storeFloat(NxReal f)
    {
        NX_ASSERT(0);
        return *this;
    }
    virtual NxStream &storeDouble(NxF64 f)
    {
        NX_ASSERT(0);
        return *this;
    }
    virtual NxStream &storeBuffer(const void *buffer, NxU32 size)
    {
        NX_ASSERT(0);
        return *this;
    }

    mutable const NxU8 *buffer;
};

}
}

#endif // NXUSTREAMING_H_
